import { Request } from 'express';

/**
 * 从请求中获取客户端真实IP地址
 * 支持代理、负载均衡等场景
 */
export function getClientIp(req: Request): string {
  // 优先从 X-Forwarded-For 获取（通过代理的情况）
  const forwardedFor = req.headers['x-forwarded-for'] as string;
  if (forwardedFor) {
    // X-Forwarded-For 可能包含多个IP，取第一个（最原始的客户端IP）
    return forwardedFor.split(',')[0].trim();
  }

  // 从 X-Real-IP 获取（Nginx代理常用）
  const realIp = req.headers['x-real-ip'] as string;
  if (realIp) {
    return realIp.trim();
  }

  // 从 CF-Connecting-IP 获取（Cloudflare）
  const cfIp = req.headers['cf-connecting-ip'] as string;
  if (cfIp) {
    return cfIp.trim();
  }

  // 最后使用 socket 地址
  const socketAddress = req.socket.remoteAddress || '';

  // 处理 IPv6 格式的 localhost (::1 或 ::ffff:127.0.0.1)
  if (socketAddress === '::1' || socketAddress === '::ffff:127.0.0.1') {
    return '127.0.0.1';
  }

  // 移除 IPv6 前缀
  if (socketAddress.startsWith('::ffff:')) {
    return socketAddress.substring(7);
  }

  return socketAddress;
}
